import yaml
import os

class ProjectEditor:
    def __init__(self, file_path):
        self.file_path = file_path
        with open(file_path, "r", encoding="utf-8") as f:
            self.data = yaml.safe_load(f)
        
        if not isinstance(self.data, dict):
            raise ValueError(f"YAML 文件解析失败，期望得到 dict 类型，实际为 {type(self.data)}")
    def add_multiple_instances(self, module_name, instance_key, count, template_data=None):
            """
            批量添加多个相同键名的实例
            
            :param module_name: 模块名称，如 "JS111"
            :param instance_key: 子项键名，如 "基础"
            :param count: 添加多少个实例
            :param template_data: 可选的基础字段字典，用于填充新实例的内容
            """
            for project in self.data.get("project_list", []):
                if "instance_mapping" not in project:
                    project["instance_mapping"] = {}

                module = project["instance_mapping"]
                if module_name not in module:
                    module[module_name] = []

                instances = module[module_name]

                # 清除已有该 key 的实例
                instances[:] = [item for item in instances if instance_key not in item]

                # 如果没有提供模板数据，则使用默认空字典
                if template_data is None:
                    template_data = {}

                # 批量添加新实例
                for i in range(count):
                    new_instance = {
                        f"{instance_key}_{i + 1}": template_data.copy()
                    }
                    instances.append(new_instance)

    def update_or_add_instance(self, module_name, instance_key, field_name, new_value):
        """
        修改或添加指定模块下的子项字段
        
        :param module_name: 模块名称，如 "JS103"
        :param instance_key: 子项键名，如 "基础底"
        :param field_name: 要修改的字段名，如 "施工部位"
        :param new_value: 新值
        """
        for project in self.data.get("project_list", []):
            if "instance_mapping" not in project:
                project["instance_mapping"] = {}

            module = project["instance_mapping"]
            if module_name not in module:
                module[module_name] = []

            instances = module[module_name]
            found = False

            # 查找已有实例
            for item in instances:
                if instance_key in item:
                    item[instance_key][field_name] = new_value
                    found = True
                    break

            # 未找到则添加新实例
            if not found:
                new_instance = {
                    instance_key: {
                        field_name: new_value
                    }
                }
                instances.append(new_instance)

    def update_global_field(self, field_name, new_value):
        """
        修改公共字段（顶层字段）
        
        :param field_name: 字段名，如 "施工日期"
        :param new_value: 新值
        """
        for project in self.data.get("project_list", []):
            project[field_name] = new_value

    def get_project_data(self):
        """
        获取当前内存中的项目数据（不保存到文件）
        
        :return: dict - 当前项目结构数据
        """
        return self.data

    def save_to(self, output_path):
        """
        将当前内存中的 YAML 数据保存到指定路径
        
        :param output_path: 输出文件路径，如 "output/项目基本信息_更新版.yaml"
        """
        os.makedirs(os.path.dirname(output_path), exist_ok=True)  # 自动创建目录

        with open(output_path, "w", encoding="utf-8") as f:
            yaml.dump(self.data, f, allow_unicode=True)
    

    def update_instance_key(self, module_name, old_key, new_key):
        """
        修改指定模块下的子项键名

        :param module_name: 模块名称，如 "JS103"
        :param old_key: 旧的子项键名，如 "基础底"
        :param new_key: 新的子项键名，如 "基底"
        """
        for project in self.data.get("project_list", []):
            instance_mapping = project.get("instance_mapping", {})
            module = instance_mapping.get(module_name, [])

            for item in module:
                if old_key in item:
                    # 替换键名
                    item[new_key] = item.pop(old_key)
                    break
# # 🚀 使用示例
# if __name__ == "__main__":
#     editor = ProjectEditor("项目基本信息.yaml")

#     # ✅ 修改公共字段
#     editor.update_global_field("施工日期", "2024/06/10")
#     editor.update_global_field("施工单位", "浙江省交通工程集团有限公司")

#     # ✅ 修改(新增)模块子项字段
#     editor.update_or_add_instance("JS103", "基础底", "施工部位", "K59+639圆管涵 基础底部")

#        示例：将 JS103 模块中的 "基础底" 改为 "基底"
#     editor.update_instance_key("JS103", "基础底", "基底")

#     # 🔍 获取当前内存中的项目结构，不保存
#     current_data = editor.get_project_data()

#     # 打印查看结果
#     import pprint
#     pprint.pprint(current_data)